// v1.0.0
// 2014-06-13
// posjaj

(function($) {
	// 插件的定义
	$.fn.tablePretty = function(options) {
		// build main options before element iteration
		var opts = $.extend({}, $.fn.tablePretty.defaults, options);
		// iterate and reformat each matched element
		return this.each(function() {
			$this = $(this);
			// build element specific options
			var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
			//添加序号列
			if(o.serailNo){	
				var thCount=$this.find("thead tr").size();
				var firstRow=true;
				$this.find("thead tr").each(function(){
					if(firstRow){
						$(this).prepend("<th rowspan='"+thCount+"'></th>");
						firstRow=false;
					}	
					else{
						$(this).prepend("<th style='display:none;'></th>");
					}
				});
				var noCount=1;
				$this.find("tbody tr").each(function(){
					$(this).prepend("<td class='num'>"+noCount+"</td>");
					noCount++;
				});
				
			}				
			//设置标题的高度
			$this.find("thead tr").css({height:o.titleHeight+"px"});
			//设置数据行的高度
			$this.find("tbody tr").css({height:o.dataHeight+"px"});
			//添加table的整体样式
			$this.addClass("tablepretty");
			// 给table添加隔行变色特效,设置行高
			if(o.stripe){
				var css = "";
				$this.find("tbody tr").each(function() {
					css = (css == "odd") ? "even" : "odd";
					$(this).addClass(css);
				});
			}
			// 给每个td添加mouseover事件
			$("tbody tr td", $this).mouseover(function() {
				if(!$(this).hasClass("num")){
					$(this).parent().children().addClass("over");
					if($(this).parent().children().eq(0).hasClass("num")){
						$(this).parent().children().eq(0).removeClass("over");
					}
				}
			});
			// 给每个td添加mouseout事件
			$("tbody tr td", $this).mouseout(function() {
				if(!$(this).hasClass("num")){
					$(this).parent().children().removeClass("over");
				}
			});
			// 给每个th添加mouseover事件
			$("thead tr th", $this).mouseover(function() {
				$(this).addClass("over");
			});
			// 给每个th添加mouseout事件
			$("thead tr th", $this).mouseout(function() {
				$(this).removeClass("over");
			});
			// 合并列
			if (o.mergeCol.length > 0) {
				for (var i = o.mergeCol.length - 1; o.mergeCol[i] != undefined; i--) {
					mergeCell($this, o.mergeCol[i]);
				}
			}			
		});
	};
	
	/*
	 * 合并行
	 * rowIndex：合并哪一行
	 * cellIndex:从start列开始
	 * colspan:colspan
	 */
	$.fn.tablePretty.mergeRow =function($table,rowIndex,cellIndex,colspan){
		var $tr=$table.find("tbody tr").eq(rowIndex);
		var $td = $('td:eq(' + cellIndex + ')', $tr);
		$td.attr('colspan', colspan);
		
		for(var i=cellIndex+1;i<cellIndex+colspan;i++){
			$tr.find("td").eq(i).hide();
		}
	}

	/*
	 * 定义暴露mergeCol函数 使用方法 使用1：$.fn.tablePretty.mergeCol($("#listTalbe"),[0,1]);
	 * 使用2：$.fn.tablePretty.mergeCol($("#listTalbe"),0);
	 */
	$.fn.tablePretty.mergeCol = function($table, cols) {
		if ($.isArray(cols)) {// 是数组
			for (var i = cols.length - 1; cols[i] != undefined; i--) {
				mergeCell($table, cols[i]);
			}
		} else {
			mergeCell($table, cols);
		}
	};
	// 插件的defaults
	$.fn.tablePretty.defaults = {
		highlightCols : false,
		highlightRows : true,
		selectable : true,
		stripe:true,
		serailNo:true,
		mergeCol : [],
		titleHeight : 30,
		dataHeight : 30	
	};
	// 私有函数，合并列
	function mergeCell($table, colIndex) {
		$table.data('col-content', ''); // 存放单元格内容
		$table.data('col-rowspan', 1); // 存放计算的rowspan值 默认为1
		$table.data('col-td', $()); // 存放发现的第一个与前一行比较结果不同td(jQuery封装过的),默认一个"空"的jquery对象
		$table.data('trNum', $('tbody tr', $table).length); // 要处理表格的总行数,用于最后一行做特殊处理时进行判断之用
		// 我们对每一行数据进行"扫面"处理 关键是定位col-td, 和其对应的rowspan
		$('tbody tr', $table).each(
				function(index) {
					// td:eq中的colIndex即列索引
					var $td = $('td:eq(' + colIndex + ')', this);
					// 取出单元格的当前内容
					var currentContent = $td.html();
					// 第一次时走此分支
					if ($table.data('col-content') == '') {
						$table.data('col-content', currentContent);
						$table.data('col-td', $td);
					} else {
						// 上一行与当前行内容相同
						if ($table.data('col-content') == currentContent) {
							// 上一行与当前行内容相同则col-rowspan累加, 保存新值
							var rowspan = $table.data('col-rowspan') + 1;
							$table.data('col-rowspan', rowspan);
							// 值得注意的是 如果用了$td.remove()就会对其他列的处理造成影响
							$td.hide();
							// 最后一行的情况比较特殊一点
							// 比如最后2行 td中的内容是一样的,
							// 那么到最后一行就应该把此时的col-td里保存的td设置rowspan
							if (++index == $table.data('trNum'))
								$table.data('col-td').attr('rowspan', $table.data('col-rowspan'));
						} else { // 上一行与当前行内容不同
							// col-rowspan默认为1, 如果统计出的col-rowspan没有变化, 不处理
							if ($table.data('col-rowspan') != 1) {
								$table.data('col-td').attr('rowspan', $table.data('col-rowspan'));
							}
							// 保存第一次出现不同内容的td, 和其内容, 重置col-rowspan
							$table.data('col-td', $td);
							$table.data('col-content', $td.html());
							$table.data('col-rowspan', 1);
						}
					}
				});
	}
	// 同样是个private函数 清理内存之用
	function dispose($table) {
		$table.removeData();
	}
})(jQuery);